R Markdown

Reading in Data
scaled_sum <- read.csv("scaled_sum.csv")
hhs_all_complete <- read_csv("hhs_all_complete.csv")
## New names:
## * `` -> ...1
## Rows: 19745 Columns: 237
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr   (81): submissionid, 44_meeting_attendance, 45_leadership_position, 48_...
## dbl  (155): ...1, level4_id, lat, lon, ma_area, 9_region_member, 10_mpa_impo...
## dttm   (1): updatedat
## 
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
scaled_km_df <- read_csv("scaled_km_df.csv")
## New names:
## * `` -> ...1
## Rows: 4451 Columns: 130
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (37): submissionid, country, level1_name, level2_name, level4_name, ma_n...
## dbl (93): ...1, x1, level4_id, lat, lon, ma_area, x9_region_member, x44_meet...
## 
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.

We want to include a point where all responses are “neutral” on our map of compliance behaviors

neutral_point <- scaled_sum %>% 
filter(country == "NEUTRAL")

1. Mapping Indices

We now have one (x,y) point for each fisher observation, and can map them onto an X-Y plane of Agreement and Engagement.

  ggplot(data = scaled_sum,
                      aes(x = agree_mean, y = eng_mean)) +
   geom_point(color = "darkblue", size = 0.7, alpha = 0.4) +
  geom_point(data = neutral_point, aes(x = agree_mean, y = eng_mean),
             size = 8, color = "pink2") +
  labs( x = "Agreement (Scaled across 5 Questions)",
      y = "Engagement (Scaled across 5 Questions)",
      title = "Engagement and Agreement Index Mapping") +
#  scale_color_viridis(discrete = TRUE, option = "D") +
    # scale_x_continuous(limits = c(-3, 1.7),
    #                   breaks = c(-2, -1, 0, 1, 1.5)) +
   # scale_y_continuous(limits = c(-1.5, 1.5),
   #                   breaks = c( -1, 0, 1, 1.5)) +
  guides(colour = guide_legend(override.aes = list(size=7))) +
  theme_bw() 

*Figure 1: A plot with the **neutral* fisher reported within the spread of our Z-score-based indices. We see that Ms. Neutral is 1 SD below the mean in agreement. This location means that the majority of fishers at least somewhat agree with rules in place. Meanwhile, we see dense grouping between -0.5 and 0.5 on both axes. Quite a few fishers have the maximum score for agreement, while a smaller number meet the ceiling of engagement.

Size of Clusters

cluster_size <- scaled_km_df %>% 
  count(cluster_no)

ggplot(data = cluster_size, aes(x = cluster_no, y = n, fill = cluster_no)) +
  geom_bar(stat = "identity") +
  labs(x = "Fisher Type", 
       y = "Total Fishers per Group", 
       fill = "",
       title = "Sizes of Fisher-Types") +
  scale_fill_viridis(discrete = T) +
  theme_bw() +
   theme(axis.text.x = element_text(angle = 45, hjust=1)) +
    geom_text(aes(label = n), size = 3, vjust=2, color = "white")

Between Cluster 1 and 4 (our “average” fishers,) we see that C4 is a full sd higher on question 43 “Do you think there is any benefit to regulating fishing via a managed access area and a reserve area?”

Both C1 and C4 (average fishers) have higher values in question x61g (willingness to change fishing behavior for the sake of conservation,) and they slightly disagree with “encouraging others to follow regulations.”

Average fishers aren’t engaging much (including meeting attendance.) From an NGO perspective, if one wants to shift fisher behavior+attitudes, then try and bring the reluctant folks into the governance process.

2. Compliance Behaviors of Admitted rule-breakers

counts_63 <- scaled_sum %>% 
  count(x63_fishing_in_reserve, country)


filtered_63 <- scaled_sum %>% 
  filter(x63_fishing_in_reserve == "1")

ggplot(data = filtered_63,
                      aes(x = agree_mean, y = eng_mean)) +
  geom_point(color = "darkblue", size = 1.2, alpha = 1,
             show.legend = TRUE) +
labs( x = "Agreement (Scaled across 5 Questions)",
      y = "Engagement (Scaled across 5 Questions)",
      title = "Engange and Agreement of Admitted rule-breakers") +
  scale_x_continuous(limits = c(-3, 2),
                     breaks = c(-2, -1, 0, 1, 2)) +
   scale_y_continuous(limits = c(-1.5, 2),
                     breaks = c( -1, 0, 1, 2)) +
  theme_bw() 

Figure 4: A graph of Agreement and Engagement measures, colored by responses of “Do you fish inside the reserve?” These fishers range

Question 63 asks if fishers break the rules, and fish in the reserve. This would be a classic measure of compliance (although self-reporting likely leads to a lower N of admitted non-compliers)

138 fishers admitted that they fish in the reserve, while 2800 said they do not. The question we’re left with is: What is different about folks who admit to breaking rules? These “Yes” rule-breakers are spread relatively evenly across all countries. Maybe they don’t think there are sanctions, their community doesn’t care about it

I’ll do the same “rule-breaker” analysis, but against the question, “Out of 10 people in your community, how many people…Fished in the reserve in the last month”

3. Full Cluster Map

Here, I’ve attached the summary statistics of the Clusters. We ahve them on hand for tables, individual stats, Chi-Squared tests, etc.

cluster_summary_df <- scaled_km_df %>% 
  group_by(cluster_no) %>% 
  summarise(eng_mean = mean(eng_mean),
            agree_mean  = mean(agree_mean),
            x44_mean = mean(x44_meeting_attendance),
            x45_mean = mean(x45_leadership_position),
            x48_mean = mean(x48_enforcement_participation),
            x53_mean = mean(x53_encourage_regulations),
            x61g_mean = mean(x61g_fishing_change_behavior), 
            x43_mean =  mean(x43_ma_benefits),
            x46_mean = mean(x46_represent_interests),
           x52_mean = mean(x52_ma_benefit_5yrs),
           x61a_mean = mean(x61a_current_regulations),
           x61f_mean = mean(x61f_rights_distribution_fair),
           x30a_mean = mean(x30_trust_local_decision),
           x44_median = median(x44_meeting_attendance),
            x45_median = median(x45_leadership_position),
            x48_median = median(x48_enforcement_participation),
            x53_median = median(x53_encourage_regulations),
            x61g_median = median(x61g_fishing_change_behavior), 
            x43_median =  median(x43_ma_benefits),
            x46_median = median(x46_represent_interests),
           x52_median = median(x52_ma_benefit_5yrs),
           x61a_median = median(x61a_current_regulations),
           x61f_median = median(x61f_rights_distribution_fair),
            x30a_median = median(x30_trust_local_decision)) %>% 
  mutate(across(where(is.numeric), ~ round(., 2)))
## Here, the last line of code rounds to the second decimal 

cluster_medians <- cluster_summary_df %>% 
  select(1, 14:23) 

cl_mean_graphable_df <- cluster_summary_df %>% 
  select(eng_mean, agree_mean, cluster_no)



scaled_cluster_counts <- scaled_km_df %>% 
  count(cluster_no)


ggplot() +
  geom_point(data = scaled_km_df,
       aes(x = agree_mean, y = eng_mean,
           color = cluster_no),
           size = 0.7, alpha = 0.7) +
   geom_point(data = cl_mean_graphable_df,
             aes(x = agree_mean, y = eng_mean,
          color = cluster_no),
           size = 6, shape = "triangle", show.legend = FALSE) +
  labs( x = "Agreement (Scaled across 5 Questions)",
      y = "Engagement (Scaled across 5 Questions)",
      title = "Mapping Clusters",
      color = "Cluster") +
  scale_x_continuous(limits = c(-3, 2),
                     breaks = c(-2, -1, 0, 1, 2)) +
   scale_y_continuous(limits = c(-1.5, 2),
                     breaks = c( -1, 0, 1, 2)) +
   guides(colour = guide_legend(override.aes = list(size=7)))
## Warning: Removed 10 rows containing missing values (geom_point).

The 4 Clusters, done marked by color. Means are marked by triangles.

Between Cluster 1 and 4 (our “average” fishers,) we see that C4 is a full sd higher on question 43 “Do you think there is any benefit to regulating fishing via a managed access area and a reserve area?”

Both C1 and C4 (average fishers) have higher values in question x61g (willingness to change fishing behavior for the sake of conservation,) and they slightly disagree with “encouraging others to follow regulations.”

Average fishers aren’t engaging much (including meeting attendance.) From an NGO perspective, if one wants to shift fisher behavior+attitudes, then try and bring the reluctant folks into the governance process.

kmeans_kable <- head(cluster_summary_df) %>% 
kable( format = "html", caption = "Summary of Clusters") %>%
   kable_styling(bootstrap_options = "striped",
                full_width = F,
                position = "left") %>%
collapse_rows(columns = 3, valign = "middle")


kmeans_kable
Summary of Clusters
cluster_no eng_mean agree_mean x44_mean x45_mean x48_mean x53_mean x61g_mean x43_mean x46_mean x52_mean x61a_mean x61f_mean x30a_mean x44_median x45_median x48_median x53_median x61g_median x43_median x46_median x52_median x61a_median x61f_median x30a_median
Committed 0.87 0.30 0.89 0.52 0.50 0.66 4.19 0.65 0.89 0.72 4.06 4.10 4.10 1 1 1 1 4 1 1 1 4 4 4
Resistant -0.42 -0.87 -0.47 -0.65 -0.74 -0.45 3.38 0.46 0.01 0.19 2.76 2.80 2.74 -1 -1 -1 0 4 0 0 0 3 3 3
Supportive -0.18 0.31 -0.06 -0.81 -0.86 -0.15 4.07 1.00 0.76 0.66 4.10 3.95 3.90 -1 -1 -1 0 4 1 1 1 4 4 4
Wavering -0.24 -0.13 -0.19 -0.86 -0.87 -0.18 4.03 0.00 0.70 0.30 4.13 3.87 4.04 -1 -1 -1 0 4 0 1 0 4 4 4

4. Perceived Catch + Clusters

no_na_19 <- scaled_km_df %>% 
    drop_na(x19_current_fish_catch) %>% 
 mutate(x19_current_fish_catch = recode_factor(x19_current_fish_catch, 
    "Declined a lot" = "1. Declined a lot",
          "Declined slightly" = "2. Declined slightly",
           "Stayed the same" = "3. Stayed the same",
          "Improved slightly" = "4. Improved slightly",
          "Improved heavily" = "5. Improved heavily")) 
         
         
mean_19_df <- no_na_19 %>% 
        group_by(x19_current_fish_catch) %>% 
        summarise(eng_mean = mean(eng_mean),
                  agree_mean  = mean(agree_mean)) 
x19_counts <- no_na_19 %>% 
  count(x19_current_fish_catch)

x19_cluster_counts <- no_na_19 %>% 
  group_by(cluster_no) %>% 
  count(x19_current_fish_catch)


ggplot(x19_cluster_counts,
       aes(x = x19_current_fish_catch, y = n, fill = cluster_no,
           )) +
  geom_bar(position="fill", stat="identity") +
  labs( x = "Perception of Fish Stock (over last 2 years)",
      y = "Percentage",
      fill = "Cluster") +
    guides(colour = guide_legend(override.aes = list(size=7))) +
  theme_classic() +
  theme(axis.text.x = element_text(angle = 45, hjust=1))

reversed_x19_counts <- 
  no_na_19 %>% 
  group_by(x19_current_fish_catch) %>% 
  count(cluster_no)

ggplot(reversed_x19_counts,
       aes(x = cluster_no, y = n, fill = x19_current_fish_catch)) +
  geom_bar(position="fill", stat="identity", alpha = 0.7) +
  labs( x = "Clusters",
      y = "Percentage of Cluster",
      title = "Perceived Catch and Clusters", 
      fill = "Perceived Change in Fish Catch \n (compared with 2 years prior)") +
  scale_fill_viridis(discrete = T) +
  theme_bw()

5. Fishing Effort in “Low Season”

First, I clean the dataframe

fishing_effort_17 <- scaled_km_df %>% 
  filter(x17_fishing_low_profit %in% c("Once or never",
                                         "A few times",
                                         "A few times per month",
                                        "1-2 per week",
                                         "More than 1-2 times per week",
                                       na.rm = FALSE)) %>% 
  drop_na(x17_fishing_low_profit) %>% 
mutate(x17_fishing_low_profit = recode_factor(x17_fishing_low_profit, "Once or never" = "Rarely or Never")) %>% 
  mutate(x17_fishing_low_profit = recode_factor(x17_fishing_low_profit, "A few times" = "Rarely or Never"))
  

x17_counts <- fishing_effort_17 %>% 
  group_by(x17_fishing_low_profit) %>% 
  count()

x17_cluster_counts <- fishing_effort_17 %>% 
  group_by(cluster_no) %>% 
  count(x17_fishing_low_profit)

Then I visualize

ggplot(x17_cluster_counts,
       aes(x = cluster_no, y = n, fill = x17_fishing_low_profit)) +
  geom_bar(position="fill", stat="identity", alpha = 0.8) +
  labs( x = "Fisher Type",
      y = "Percentage of Group",
      title = "Fishing Effort in Offseason", 
      fill = "Fishing Effort (Per Week)") +
   scale_fill_viridis(discrete = T) +
  scale_y_continuous(labels = scales::percent) +
  theme_bw() +
   theme(axis.text.x = element_text(angle = 45, hjust=1))

  • Resistant fishers who fish 1+ times per week: 236/526 = 45%
  • Wavering fishers who fisher 1+ times per week: 257/998 = 26%
  • Supportive fishers who fisher 1+ times per week: 370/1279 = 29%
  • Committed fishers who fisher 1+ times per week: 236/812 = 29%

Second figure will be another stacked barplot This is rad! I’m going to code away at x18, and then do a little more interpreting.

6. Fishing Effort in “High Season”

Dataframe cleaning

x18_fishing_effort <- scaled_km_df %>% 
  filter(x18_fishing_high_profit %in% c(
    "Once or never",
"A few times",
"A few times per month",
"1-2 per week", 
"More than 1-2 times per week")) %>% 
mutate(x18_fishing_high_profit = recode_factor(x18_fishing_high_profit, "Once or never" = "Rarely or Never")) %>% 
  mutate(x18_fishing_high_profit = recode_factor(x18_fishing_high_profit, "A few times" = "Rarely or Never")) %>% 
  drop_na(x18_fishing_high_profit) %>% 
  mutate(x18_fishing_high_profit = fct_relevel(x18_fishing_high_profit, 
                                               "Rarely or Never",
                                           "A few times per month",
                                               "1-2 per week", 
                                        "More than 1-2 times per week"))

# basic counts

x18_counts <- x18_fishing_effort %>% 
  count(x18_fishing_high_profit)

x18_cluster_counts <- x18_fishing_effort %>% 
  group_by(cluster_no) %>% 
  count(x18_fishing_high_profit)

Let’s do the same visualization for 18, as I did for 17.

Visualziation

ggplot(x18_cluster_counts,
       aes(x = cluster_no, y = n, fill = x18_fishing_high_profit)) +
  geom_bar(position="fill", stat="identity", alpha = 0.8) +
  labs( x = "Fisher Type",
      y = "Percentage of Group",
      title = "Fishing in High Season", 
      fill = "Frequency of Fishing") +
   scale_fill_viridis(discrete = T) +
  scale_y_continuous(labels = scales::percent) +
  theme_bw() +
   theme(axis.text.x = element_text(angle = 45, hjust=1))

  • Resistant fishers who fish 1+ times per week: 70%
  • Wavering fishers who fisher 1+ times per week: 84%
  • Supportive fishers who fisher 1+ times per week: 83%
  • Committed fishers who fisher 1+ times per week: 73%

supportive : 719, wavering 563, Committed 414, resistant 227

7. Food Security
  • Question #23: “Do you believe that the job of a fisher is secure in the future?”
  • Question #29: “To cover family needs your household income is…”
  • Question #54: “How do you rate the last year in terms of food availability?”
  • Question #59: “Are you confident that you will be able to procure enough food for you and your family for the next 12 months?”
  • Question #60: In the last 12 months, how often did your household eat fish?

Starting with 55 and 56

food_security <- scaled_km_df %>% 
  select(country, cluster_no, x23_job_secure, x26_fishing_income_save, x28_buyer_loans, x29_family_income, x55_worry_food, x59_food_procurement, x60_hh_fish_consumption, eng_mean, agree_mean, x54_food_availability) %>% 
  drop_na()

Ability to cover family costs

income_counts <- food_security %>% 
  mutate(x29_family_income = fct_relevel(x29_family_income, 
                                         "Sufficient",
                                         "Tight",
                                         "Insufficient")) %>% 
  group_by(cluster_no) %>% 
  count(x29_family_income)


ggplot(income_counts,
       aes(x = cluster_no, y = n, fill = x29_family_income)) +
  geom_bar(position="fill", stat="identity", alpha = 0.8) +
  labs( x = "Clusters (1 and 4 are 'average')",
      y = "Percentage of Cluster",
      title = "Ability to cover family costs", 
      fill = "Household funds are..") +
   scale_fill_viridis(option="inferno", discrete = T) +
   scale_y_continuous(labels = scales::percent) +
  theme_bw() +
   theme(axis.text.x = element_text(angle = 45, hjust=1))

Below, Food Security is asked in terms of the quality of food availability the past year, and the confidence for the upcoming year.

Measuring Question 54, “How do you rate the last year in terms of food availability?”

x54_cluster_counts <- food_security %>% 
  group_by(cluster_no) %>% 
  count(x54_food_availability) %>% 
  drop_na()

ggplot(x54_cluster_counts,
       aes(x = cluster_no, y = n, fill = x54_food_availability)) +
  geom_bar(stat="identity", alpha = 0.8) +
  labs( x = "Clusters (1 and 4 are 'average')",
      y = "Total # of Fishers",
      title = "Food Availability (Past Year)", 
      fill = "'Rating' Food availability",
      caption = "How do you rate the last year in terms of food availability?") 

ggplot(x54_cluster_counts,
       aes(x = cluster_no, y = n, fill = x54_food_availability)) +
  geom_bar(position="fill", stat="identity", alpha = 0.7) +
  labs( x = "Fisher Type",
      y = "Percentage of fishers",
      title = "Food Availability (past Year)", 
      fill = "Level of Food") +
   scale_fill_viridis(discrete = T)

“Are you confident that you will be able to procure enough food for you and your family for the next 12 months?

x59_counts <- food_security %>% 
  group_by(cluster_no) %>% 
  count(x59_food_procurement) %>% 
  drop_na() %>% 
  mutate(x59_food_procurement = recode_factor(x59_food_procurement,
                                              "Confident not" = "Not confident",
                                              "Very confident not" = "Very not confident"))

ggplot(x59_counts,
       aes(x = cluster_no, y = n, fill = x59_food_procurement)) +
  geom_bar(stat="identity", alpha = 0.8) +
  labs( x = "Clusters (1 and 4 are 'average')",
      y = "Total # of Fishers",
      title = "Food Security Confidence (Upcoming Year)", 
      fill = "'Rating' Food availability",
      caption = "Are you confident that you will be able to procure enough food for you and your family for the next 12 months?") +
  # geom_text(aes(label = n),position = position_dodge(0.9), vjust = 2, size = 2, color = "gray1")+
  theme_bw()

Food Security (“worrying about food”)
x55_cluster_counts <- food_security %>% 
  mutate(x55_worry_food = fct_relevel(x55_worry_food, 
                                  c("Never", 
                                  "Sometimes",
                                  "Often"))) %>% 
  group_by(x55_worry_food) %>% 
  count(cluster_no) 

ggplot(x55_cluster_counts,
       aes(x = cluster_no, y = n, fill = x55_worry_food)) +
  geom_bar(position="fill", stat="identity", alpha = 0.7) +
  labs( x = "Fisher Type",
      y = "Percentage of fishers",
      title = "Food Insecurity", 
      fill = "Frequency \n of  Worry", 
      caption = "Worry about Food Security (last 12 months)") +
   scale_fill_viridis(option="inferno", discrete = T) +
   scale_y_continuous(labels = scales::percent) +
   theme(axis.text.x = element_text(angle = 45, hjust=1)) +
  theme_bw()

#8. Enforcement Type + Clusters

Starting with Enforcement

enforcement_df <- scaled_km_df %>% 
  select(eng_mean, agree_mean, cluster_no, x49_enforcement_responsible, x51b_fishers_reserves, country) %>% 
filter(x49_enforcement_responsible %in% c("Fisheries Management Body",
                                         "Subnational Government",
                                         "No enforcement system",
                                         "Myself",
                                         "National Government", na.rm = FALSE))

### To make a grouped bar chart, I want counts for each cluster


enforcement_counts <- enforcement_df %>% 
  select(eng_mean, agree_mean, cluster_no, x49_enforcement_responsible, x51b_fishers_reserves, country) %>% mutate(x49_enforcement_responsible = fct_relevel(x49_enforcement_responsible,                                                                             "Fisheries Management Body",
                                              "No enforcement system",
                                              "Myself",
                                              "Subnational Government",
                                              "National Government")) %>% 
  
  group_by(x49_enforcement_responsible) %>% 
  count(cluster_no)

  
swtiched_enforcement_counts <- enforcement_df %>% 
  mutate(x49_enforcement_responsible = fct_relevel(x49_enforcement_responsible,                                                                             "Fisheries Management Body",
                                              "No enforcement system",
                                              "Myself",
                                              "Subnational Government",
                                              "National Government")) %>% 
  group_by(cluster_no) %>% 
  count(x49_enforcement_responsible)
  

### Above = Data cleaning

ggplot(swtiched_enforcement_counts,
       aes(x = cluster_no, y = n, fill = x49_enforcement_responsible)) +
  geom_bar(position="fill", stat="identity", alpha = 0.8) +
  labs( x = "Cluster #",
      y = "Proportion",
      title = "Enforcement By Cluster", 
      fill = "Enforcement Type") +
    guides(colour = guide_legend(override.aes = list(size=7))) +
  theme_bw() +
  scale_y_continuous(labels = scales::percent) +
   theme(axis.text.x = element_text(angle = 45, hjust=1))

  # scale_x_continuous(limits = c(-3, 2),
  #                    breaks = c(-2, -1, 0, 1, 2)) +
  #  scale_y_continuous(limits = c(-1.5, 2),
  #                    breaks = c( -1, 0, 1, 2)) +



ggplot(enforcement_counts,
       aes(x = x49_enforcement_responsible, y = n, fill = cluster_no)) +
  geom_bar(position="fill", stat="identity", alpha = 0.8) +
  labs( x = "Enforcement Responsibility",
      y = "Cluster",
      title = "Enforcement By Cluster", 
      color = "Cluster") +
    guides(colour = guide_legend(override.aes = list(size=7))) +
  theme(axis.text.x = element_text(angle = 45, hjust=1))

“Who is responsible for enforcement in your community? 1. Fisheries Management Body 2. National Government 3. Subnational Government 4. Other (please state) 5. There is no enforcement system”

9. Job Security
job_security_counts <- food_security %>% 
  mutate(x23_job_secure = recode_factor(x23_job_secure, "1" = "Secure",
                                        "0" = "Not Secure")) %>% 
  group_by(x23_job_secure) %>% 
  count(cluster_no)  

Wavering: 55% job secure Resistant: 46% job secure Committed: 71% job Secure Supportive: 65% job secure

Let’s graph this

ggplot(job_security_counts,
       aes(x = cluster_no, y = n, fill = x23_job_secure)) +
  geom_bar(position="fill", stat="identity", alpha = 0.7) +
  labs( x = "Fisher Type",
      y = "Total Fishers",
      title = "Job Security", 
      color = "Cluster", 
      caption = "Perception of Job Security, 'in the future'",
      fill = "") +
   scale_fill_viridis(discrete = T) +
  theme_bw() +
  coord_flip()

## Second graph with ) at the midline, like a population chart
Comparing enforcement with Perceived Fish catch (Q19)
enforcement_and_catch <- scaled_km_df %>% 
  select(cluster_no, x19_current_fish_catch, x49_enforcement_responsible) %>% 
  filter(x49_enforcement_responsible %in% c("Fisheries Management Body",
                                            "National Government", 
                                            "Subnational Government", 
                                            "No enforcement system", 
                                            "Myself")) %>% 
  drop_na()

x19_over_49 <- enforcement_and_catch %>% 
  group_by(x49_enforcement_responsible) %>% 
  count(x19_current_fish_catch)

x49_over_19 <- enforcement_and_catch %>% 
  group_by(x19_current_fish_catch) %>% 
  count(x49_enforcement_responsible)

I’ll visualize the two, and verbalize + write what what each ones tells us (i.e. what’s different between the two.)

ggplot(x19_over_49,
       aes(x = x19_current_fish_catch, y = n, fill = x49_enforcement_responsible)) +
  geom_bar(position="dodge", stat="identity", alpha = 0.8) +
  labs( x = "Enforcement Responsibility",
      y = "N",
      title = "Enforcement Against Perceived Catch", 
      fill = "Enforcement Responsibility") +
  geom_text(aes(label = n),position = position_dodge(0.9), vjust = 1, size = 2, color = "gray1") +
    guides(colour = guide_legend(override.aes = list(size=7))) +
  theme(axis.text.x = element_text(angle = 45, hjust=1)) +
  scale_fill_viridis(discrete = T) 

### Switching Axes
ggplot(x49_over_19,
       aes(x = x49_enforcement_responsible, y = n, fill = x19_current_fish_catch)) +
  geom_bar(position="fill", stat="identity", alpha = 0.8) +
  labs( x = "Enforcement Responsibility",
      y = "N",
      title = "Enforcement Against Perceived Catch", 
      fill = "Perceived Catch Change") +
  geom_text(aes(label = n),position = position_fill(0.9), vjust = 1, size = 2, color = "gray1") +
    guides(colour = guide_legend(override.aes = list(size=7))) +
  theme(axis.text.x = element_text(angle = 45, hjust=1)) +
  scale_fill_viridis(discrete = T) 

What do we see?

When the X bins are Enforcement type, I think we see a better picture. Asking “how many folks, udner subnational enforcement saw no change if fish catch?” is easier than “OK, among those who saw a slight decline, how many have no enforcement system?”

We start with the institution (albeit perceived) and then step into the personal perception fo fish catch over time.

  • FMB-responsibility has the highest amount of “improved (relative and absolute)
  • Subnational ahd the msot “Stayed the Same” (relative)
  • No enforcement or “myself” had the higher proportions of “Declined a lot.”

Let’s get some count data (classic post-visualization move)

enforcement_wider <- enforcement_counts %>% 
  pivot_wider(names_from = x49_enforcement_responsible, 
              values_from = n) %>% 
 bind_rows(summarise_all(., ~if(is.numeric(.)) sum(.) else "Total"))


enforcement_kable_1 <- head(enforcement_wider) %>% 
  kable( format = "html", caption = "Enforcement") %>% 
  kable_styling(bootstrap_options = "striped", 
                full_width = F,
                position = "left") %>% 
collapse_rows(columns = 3, valign = "middle")


enforcement_kable_1
Enforcement
cluster_no Fisheries Management Body No enforcement system Myself Subnational Government National Government
Committed 633 4 22 123 192
Resistant 276 106 27 107 150
Supportive 681 51 46 435 277
Wavering 499 33 23 361 199
Total 2089 194 118 1026 818

Chi-Squared Means Testing

**For the Figures that we include in the Manuscript, we’ll need to test the significance of the different groups. We have very large Ns and feel confident in the groupings for that reason.

2a. Enforcement Responsibility

Chi-Squared Test Null: There is no significant difference between the Cluster makeup of each bucket of enforcement responsibility Alternative: there is a menaingful difference between the compliance behaviors of each enforcement responsoibility

enforcement_counts_table <- enforcement_counts %>% 
   pivot_wider(names_from = x49_enforcement_responsible, values_from = n) %>% 
  rename(Cluster = cluster_no)

enforcement_counts_prop <- enforcement_counts_table %>% 
  janitor::adorn_percentages(denominator = "row") %>% 
  adorn_pct_formatting(digits = 0) %>% 
  adorn_ns(position = "front")


enforcement_counts_prop
##     Cluster Fisheries Management Body No enforcement system  Myself
##   Committed                 633 (65%)               4  (0%) 22 (2%)
##   Resistant                 276 (41%)             106 (16%) 27 (4%)
##  Supportive                 681 (46%)              51  (3%) 46 (3%)
##    Wavering                 499 (45%)              33  (3%) 23 (2%)
##  Subnational Government National Government
##               123 (13%)           192 (20%)
##               107 (16%)           150 (23%)
##               435 (29%)           277 (19%)
##               361 (32%)           199 (18%)
kable(enforcement_counts_prop) %>% 
  kable_styling()
Cluster Fisheries Management Body No enforcement system Myself Subnational Government National Government
Committed 633 (65%) 4 (0%) 22 (2%) 123 (13%) 192 (20%)
Resistant 276 (41%) 106 (16%) 27 (4%) 107 (16%) 150 (23%)
Supportive 681 (46%) 51 (3%) 46 (3%) 435 (29%) 277 (19%)
Wavering 499 (45%) 33 (3%) 23 (2%) 361 (32%) 199 (18%)

Now let’s run the Chi-Squared test.

enforcement_pre_chi <- enforcement_counts_table %>% 
  select(-Cluster)

enforcement_chi <- chisq.test(enforcement_pre_chi)


enforcement_chi
## 
##  Pearson's Chi-squared test
## 
## data:  enforcement_pre_chi
## X-squared = 431.86, df = 12, p-value < 2.2e-16

Clustered Enforcement has a p-value < 2.2e-16

2b. Perceived Catch
perceived_catch_table <- x19_cluster_counts %>% 
  pivot_wider(values_from =  n, names_from = x19_current_fish_catch) %>% 
  rename(Cluster = cluster_no) 

preceived_catch_props <- perceived_catch_table %>% 
  janitor::adorn_percentages(denominator = "row") %>% 
  adorn_pct_formatting(digits = 0) %>% 
  adorn_ns(position = "front")

kable(preceived_catch_props) %>% 
  kable_styling()
Cluster
  1. Declined a lot
  1. Declined slightly
  1. Stayed the same
  1. Improved slightly
  1. Improved heavily
Committed 200 (21%) 422 (43%) 186 (19%) 151 (16%) 14 (1%)
Resistant 187 (26%) 350 (48%) 115 (16%) 70 (10%) 1 (0%)
Supportive 322 (21%) 632 (42%) 447 (30%) 95 (6%) 9 (1%)
Wavering 160 (15%) 452 (41%) 423 (39%) 56 (5%) 3 (0%)

Now let’s do the Chi-squared for Perceived Catch and Clusters

pre_chi_perceived_catch <- perceived_catch_table %>% 
  ungroup() %>%
  select(2:6)


chi_perceived_catch <- chisq.test(pre_chi_perceived_catch)
## Warning in stats::chisq.test(x, y, ...): Chi-squared approximation may be
## incorrect
chi_perceived_catch
## 
##  Pearson's Chi-squared test
## 
## data:  pre_chi_perceived_catch
## X-squared = 242.96, df = 12, p-value < 2.2e-16

Clusters and Perceived catch have a p-value < 2.2e-16

2c. Fishing Effort in Offseason
offseason_effort_table <- x17_cluster_counts %>% 
  pivot_wider(values_from =  n, names_from = x17_fishing_low_profit) %>% 
  rename(Cluster = cluster_no) 

##First I pivot_wider, and made a proportion table, using janitor and kableExtra

offseason_props <- offseason_effort_table %>% 
  janitor::adorn_percentages(denominator = "row") %>% 
  adorn_pct_formatting(digits = 0) %>% 
  adorn_ns(position = "front")

kable(offseason_props) %>% 
  kable_styling()
Cluster Rarely or Never A few times per month 1-2 per week More than 1-2 times per week
Committed 416 (51%) 160 (20%) 194 (24%) 42 (5%)
Resistant 202 (38%) 88 (17%) 198 (38%) 38 (7%)
Supportive 735 (57%) 174 (14%) 333 (26%) 37 (3%)
Wavering 668 (67%) 73 (7%) 228 (23%) 29 (3%)

Actual Chi-Squared for offseason (x17)

pre_chi_offseason_effort <- offseason_effort_table %>% 
  ungroup() %>%
  select(2:5)


chi_offseason <- chisq.test(pre_chi_offseason_effort)


chi_offseason
## 
##  Pearson's Chi-squared test
## 
## data:  pre_chi_offseason_effort
## X-squared = 164.03, df = 9, p-value < 2.2e-16

X-squared = 164.03, df = 9, p-value < 2.2e-16

2d. Fishing in High Season
high_season_table <- x18_cluster_counts %>% 
  pivot_wider(values_from =  n, names_from = x18_fishing_high_profit) %>% 
  rename(Cluster = cluster_no) 

##First I pivot_wider, and made a proportion table, using janitor and kableExtra

high_season_props <- high_season_table %>% 
  janitor::adorn_percentages(denominator = "row") %>% 
  adorn_pct_formatting(digits = 0) %>% 
  adorn_ns(position = "front")

kable(high_season_props) %>% 
  kable_styling()
Cluster Rarely or Never A few times per month 1-2 per week More than 1-2 times per week
Committed 54 (8%) 127 (19%) 85 (12%) 414 (61%)
Resistant 44 (10%) 88 (20%) 89 (20%) 227 (51%)
Supportive 96 (9%) 95 (9%) 185 (17%) 719 (66%)
Wavering 66 (7%) 78 (9%) 199 (22%) 563 (62%)

Actual Chi-Squared for high season (x18)

pre_chi_high_season <- high_season_table %>% 
  ungroup() %>%
  select(2:5)

chi_high_season <- chisq.test(pre_chi_high_season)


chi_high_season
## 
##  Pearson's Chi-squared test
## 
## data:  pre_chi_high_season
## X-squared = 98.902, df = 9, p-value < 2.2e-16

X-squared = 98.902, df = 9, p-value < 2.2e-16

2E. Family Income

“How would you rate household funds?”

income_29_table <- income_counts %>% 
  pivot_wider(values_from =  n, names_from = x29_family_income) %>% 
  rename(Cluster = cluster_no) 

##First I pivot_wider, and made a proportion table, using janitor and kableExtra

income_29_props <- income_29_table %>% 
  janitor::adorn_percentages(denominator = "row") %>% 
  adorn_pct_formatting(digits = 0) %>% 
  adorn_ns(position = "front")

kable(income_29_props) %>% 
  kable_styling()
Cluster Sufficient Tight Insufficient
Committed 196 (22%) 462 (51%) 242 (27%)
Resistant 139 (20%) 397 (58%) 147 (22%)
Supportive 179 (13%) 926 (65%) 316 (22%)
Wavering 121 (11%) 705 (67%) 228 (22%)

Actual Chi-Squared for family income (x29)

pre_chi_income_29 <- income_29_table %>% 
  ungroup() %>%
  select(2:4)

chi_income_29 <- chisq.test(pre_chi_income_29)

chi_income_29
## 
##  Pearson's Chi-squared test
## 
## data:  pre_chi_income_29
## X-squared = 83.72, df = 6, p-value = 6.078e-16

X-squared = 83.72, df = 6, p-value = 6.078e-16

2F. Food Insecurity

“I worry about not having enough food for everyone in the household…”

x55_table <- x55_cluster_counts %>% 
  pivot_wider(values_from =  n, names_from = x55_worry_food) %>% 
  rename(Cluster = cluster_no) 

##First I pivot_wider, and made a proportion table, using janitor and kableExtra

x55_props <- x55_table %>% 
  janitor::adorn_percentages(denominator = "row") %>% 
  adorn_pct_formatting(digits = 0) %>% 
  adorn_ns(position = "front")

kable(x55_props) %>% 
  kable_styling()
Cluster Never Sometimes Often
Committed 162 (18%) 482 (54%) 256 (28%)
Resistant 114 (17%) 420 (61%) 149 (22%)
Supportive 268 (19%) 892 (63%) 261 (18%)
Wavering 143 (14%) 780 (74%) 131 (12%)

Actual Chi-Squared for food insecurty (x55)

pre_chi_x55 <- x55_table %>% 
  ungroup() %>%
  select(2:4)

chi_x55 <- chisq.test(pre_chi_x55)

chi_x55
## 
##  Pearson's Chi-squared test
## 
## data:  pre_chi_x55
## X-squared = 109.96, df = 6, p-value < 2.2e-16

X-squared = 109.96, df = 6, p-value < 2.2e-16

2G.Job Security

“How secure is the job of a fisher in the future?”

x23_table <- job_security_counts %>% 
  pivot_wider(values_from =  n, names_from = x23_job_secure) %>% 
  rename(Cluster = cluster_no) 

##First I pivot_wider, and made a proportion table, using janitor and kableExtra

x23_props <- x23_table %>% 
  janitor::adorn_percentages(denominator = "row") %>% 
  adorn_pct_formatting(digits = 0) %>% 
  adorn_ns(position = "front")

kable(x23_props) %>% 
  kable_styling()
Cluster Secure Not Secure
Committed 642 (71%) 258 (29%)
Resistant 316 (46%) 367 (54%)
Supportive 936 (66%) 485 (34%)
Wavering 590 (56%) 464 (44%)

Actual Chi-Squared for Job Security (Q. 23)

pre_chi_x23 <- x23_table %>% 
  ungroup() %>%
  select(2:3)

chi_x23 <- chisq.test(pre_chi_x23)

chi_x23
## 
##  Pearson's Chi-squared test
## 
## data:  pre_chi_x23
## X-squared = 128.23, df = 3, p-value < 2.2e-16

X-squared = 128.23, df = 3, p-value < 2.2e-16

Section 3. Radar Plots

clusters_for_radar <- cluster_summary_df %>% 
  select(4:14)
  
rownames(clusters_for_radar) <- c("Committed", "Resistant", "Supportive", "Wavering")
## Warning: Setting row names on a tibble is deprecated.
max_min <- data.frame(
  x44_mean = c(1, -1),
  x45_mean = c (1, -1),
  x48_mean = c(1, -1), 
  x53_mean = c (1, -1),
  x61g_mean = c(5, 1),
  x43_mean = c(1, 0),
  x46_mean = c(1, 0),
  x52_mean = c(2, -2),
  x61a_mean = c(5, 1),
  x61f_mean = c(5, 1), 
  x30a_mean = c(5, 1))

rownames(max_min) <- c("Max", "Min")


radar_df <- rbind(max_min, clusters_for_radar)

 
committed_radar <-radar_df[c("Max", "Min", "Committed"), ]

radarchart(committed_radar)

resistant_radar <- radar_df[c("Max", "Min", "Resistant"), ]

radarchart(resistant_radar)

supportive_radar <- radar_df[c("Max", "Min", "Supportive"), ]

radarchart(supportive_radar)

wavering_radar <- radar_df[c("Max", "Min", "Wavering"), ]

radarchart(wavering_radar)

# create_beautiful_radarchart(
#   data = wavering_radar,
#   color = "#00AFBB") 

Extra Tables